#ifndef ESTADOIMPRESION_H
#define ESTADOIMPRESION_H

#include <QString>
#include <QFont>
#include <QColor>
#include <QPainter>
#include "matematicas.h"
#include "informes_global.h"

#define MODO_PARRAFO 0
#define MODO_LINEA   1
#define MODO_TABLA   2

#define ALINEACION_IZQUIERDA    0
#define ALINEACION_CENTRO       1  
#define ALINEACION_DERECHA      2
#define ALINEACION_LINEA_BASE   3
#define ALINEACION_ABAJO        4
#define ALINEACION_ARRIBA       5

#define MILIMETROS_POR_PULGADA 25.4

class INFORMES_EXPORT EstadoImpresion
{
public:
    EstadoImpresion();
    EstadoImpresion(QPainter* painter, QRect rectanguloImpresion);
    virtual ~EstadoImpresion();

    void inicializar();

    void recuadrar(QColor color);

    void setPainter(QPainter* painter);
    QPainter* getPainter();

    void setRectanguloImpresion(QRect rectanguloImpresion);
    QRect getRectanguloImpresion() { return rectanguloImpresion; }

    void setModo(int modo) { this->modo = modo; }
    bool enModoParrafo() { return modo == MODO_PARRAFO; }
    bool enModoLinea() { return modo == MODO_LINEA; }
    bool enModoTabla() { return modo == MODO_TABLA; }

    void setInterlineado(double interlineado) { this->interlineado = interlineado; }
    double getInterlineado() { return this->interlineado; }

    void setMargenCeldas(double margenCeldas) { this->margenCeldas = margenCeldas; }
    double getMargenCeldas() { return this->margenCeldas; }

    void setNombreFuente(QString nombreFuente);
    void setTamanoFuente(double tamanoFuente);
    void setNegrita(bool negrita);
    void setCursiva(bool cursiva);
    void setSubrayado(bool subrayado);

    int getAltoPixelesFuente();

    void setColor(QColor color);
    QColor getColor() { return color; }
    void setGrosorTrazoMilimetros(double grosorTrazoMilimetros);
    double getGrosorTrazoMilimetros() { return grosorTrazoMilimetros; }

    double getGrosorTrazoPixeles() { return ceil(grosorTrazoMilimetros * getPixelesPorMilimetro()); }

    void setAlineacionHorizontal(int alineacionHorizontal) { this->alineacionHorizontal = alineacionHorizontal; }
    int getAlineacionHorizontal() { return alineacionHorizontal; }

    void setAlineacionVertical(int alineacionVertical) { this->alineacionVertical = alineacionVertical; }
    int getAlineacionVertical() { return alineacionVertical; }

    void setPorcentajeColumna(double porcentajeXColumna);
    void desactivarColumna();

    int getAnchoColumna();

    int getXInicialColumna() { return porcentajeInicioColumna * getAnchoPaginaPixeles() / 100.0; }
    int getXFinalColumna() { return porcentajeFinalColumna * getAnchoPaginaPixeles() / 100.0; } 

    double getPixelesPorMilimetro() { 
        int dpi = painter->device()->logicalDpiY();
        return dpi / MILIMETROS_POR_PULGADA; 
    }

    int getAnchoPaginaMilimetros() {
        return round((double) rectanguloImpresion.width() / (double) getPixelesPorMilimetro());
    }

    int getAltoPaginaMilimetros() {
        return round((double) rectanguloImpresion.height() / (double) getPixelesPorMilimetro());
    }

    int getAnchoPaginaPixeles() { 
        return rectanguloImpresion.width(); 
    }

    void setNumeroPagina(int numeroPagina) { this->numeroPagina = numeroPagina; }
    int getNumeroPagina() { return numeroPagina; }

    int getDesplazamientoYPixeles() { return desplazamientoYPixeles; }
    void setDesplazamientoYPixeles(int desplazamientoYPixeles) { this->desplazamientoYPixeles = desplazamientoYPixeles; }
    void incrementarDesplazamientoYPixeles(int incrementoPixeles);

    int calcularXInicial(int anchoLinea, const QRect& rectangulo);    
    int calcularYInicial(int alto, int descenso, const QRect& rectangulo, int descensoTotal);

protected:
    void actualizarLapiz();
    void actualizarFuente();

private:
    QPainter* painter;
    QRect rectanguloImpresion;
    QPen lapiz;
    QFont fuente;

    int modo;    
    QColor color;    
    double grosorTrazoMilimetros;
    double interlineado;
    double margenCeldas;
    int alineacionHorizontal;
    int alineacionVertical;
    QString nombreFuente;
    double tamanoFuente;
    bool negrita;
    bool cursiva;
    bool subrayado;
   
    double porcentajeInicioColumna;
    double porcentajeFinalColumna;

    int desplazamientoYPixeles;
    int numeroPagina;
};

#endif // ESTADOIMPRESION_H
